// #include <iostream>
// #include <cstring>
// #include <algorithm>
// using namespace std;
// const int N = 10010;
// int n, V, M;
// int v[N], w[N], m[N];
// int mem[N][N][N];
// int dfs(int x, int spv, int spm)
// {
//     if (x > n)
//         return 0;
//     else
//     {
//         if (spv >= v[x] && spm >= m[x])
//             return max(dfs(x + 1, spv, spm), dfs(x + 1, spv - v[x], spm - m[x]) + w[x]);
//         else
//             return dfs(x + 1, spv, spm);
//     }
// }
// int main()
// {
//     ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//     cin >> n >> V >> M;
//     for (int i = 1; i <= n; i++)
//     {
//         cin >> v[i] >> m[i] >> w[i];
//     }
//     int res = dfs(1, V, M);
//     cout << res << endl;
//     return 0;
// }

// #include <iostream>
// #include <cstring>
// #include <algorithm>
// using namespace std;

// const int N = 10010;
// int n, V, M;
// int v[N], m[N], w[N];
// int dp[1001][101][101]; // 三维DP数组

// int main()
// {
//     ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
//     cin >> n >> V >> M;
//     for (int i = 1; i <= n; i++)
//     {
//         cin >> v[i] >> m[i] >> w[i];
//     }
//     // 初始化DP数组
//     memset(dp, 0, sizeof(dp)); // 当没有物品时，最大价值为0

//     // 动态规划填充DP数组
//     for (int i = 1; i <= n; i++)
//     { // 第i个物品
//         for (int j = 0; j <= V; j++)
//         { // 背包容量为j
//             for (int k = 0; k <= M; k++)
//             { // 背包重量为k
//                 // 不选择第i个物品
//                 dp[i][j][k] = dp[i - 1][j][k];
//                 // 选择第i个物品，前提是当前容量和重量足够
//                 if (j >= v[i] && k >= m[i])
//                 {
//                     dp[i][j][k] = max(dp[i][j][k], dp[i - 1][j - v[i]][k - m[i]] + w[i]);
//                 }
//             }
//         }
//     }

//     // 输出结果，即考虑所有物品，背包容量为V，可承受重量为M的最大价值
//     cout << dp[n][V][M] << endl;
//     return 0;
// }

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 10010;
int n, V, M;
int v[N], m[N], w[N];
int dp[101][101]; // 维DP数
int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> V >> M;
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i] >> m[i] >> w[i];
    }
    // 初始化DP数组
    memset(dp, 0, sizeof(dp)); // 当没有物品时，最大价值为0

    // 动态规划填充DP数组
    for (int i = 1; i <= n; i++)
    { // 第i个物品
        for (int j = V; j >= v[i]; j--)
        { // 背包容量为j
            for (int k = M; k >= m[i]; k--)
            {
                dp[j][k] = max(dp[j][k], dp[j - v[i]][k - m[i]] + w[i]);
            }
        }
    }

    // 输出结果，即考虑所有物品，背包容量为V，可承受重量为M的最大价值
    cout << dp[V][M] << endl;
    return 0;
}
